/**
 * 文件处理工具类
 * 提供统一的文件选择、读取和验证功能
 */
export class FileUtils {
  /**
   * 读取文本文件内容
   * @param file 要读取的文件
   * @param encoding 文件编码，默认utf-8
   * @returns Promise<string> 文件内容
   */
  public static async readTextFile(file: File, encoding: string = 'utf-8'): Promise<string> {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      
      reader.onload = (e) => {
        if (e.target?.result) {
          resolve(e.target.result as string);
        } else {
          reject(new Error('文件内容为空或无法读取'));
        }
      };
      
      reader.onerror = () => {
        reject(new Error('文件读取失败，请检查文件是否可读'));
      };
      
      reader.readAsText(file, encoding);
    });
  }
  
  /**
   * 读取JSON文件并解析
   * @param file 要读取的JSON文件
   * @param removeComments 是否移除注释，默认true
   * @returns Promise<any> 解析后的JSON对象
   */
  public static async readJsonFile(file: File, removeComments: boolean = true): Promise<any> {
    try {
      // 验证文件类型
      const fileName = file.name.toLowerCase();
      const isJsonFile = file.type.includes('json') || fileName.endsWith('.json');
      
      if (!isJsonFile) {
        throw new Error('请选择JSON格式的文件');
      }
      
      // 读取文件内容
      let content = await this.readTextFile(file);
      
      // 移除注释
      if (removeComments) {
        const commentRegex = new RegExp('//.*', 'gm');
        content = content.replace(commentRegex, '');
      }
      
      // 验证内容是否为空
      if (content.trim().length === 0) {
        throw new Error('JSON文件内容为空');
      }
      
      // 解析JSON
      const parsed = JSON.parse(content);
      return parsed;
    } catch (error) {
      if (error instanceof Error) {
        throw error;
      }
      throw new Error('JSON解析错误，请检查文件格式');
    }
  }
  
  /**
   * 验证字体文件
   * @param file 要验证的文件
   * @returns boolean 是否为字体文件
   */
  public static isFontFile(file: File): boolean {
    return /\.ttf$/i.test(file.name);
  }
  
  /**
   * 加载字体文件
   * @param file 字体文件
   * @param fontFamily 字体名称
   * @returns Promise<FontFace> 加载的字体
   */
  public static async loadFontFile(file: File, fontFamily: string = 'custom-font'): Promise<FontFace> {
    if (!this.isFontFile(file)) {
      throw new Error('请选择TTF格式的字体文件');
    }
    
    const url = URL.createObjectURL(file);
    const fontFace = new FontFace(fontFamily, `local('${fontFamily}'),url('${url}')`);
    
    try {
      await fontFace.load();
      document.fonts.add(fontFace);
      return fontFace;
    } catch (error) {
      throw new Error('字体文件加载失败');
    }
  }
}